From 75e4b674767a7c91d6125e0a31759a376848ef43 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Mon, 7 Feb 2005 18:29:22 +0000 Subject: [PATCH] bitkeeper revision 1.1159.212.112 (4207b382VvZgSA3Pg79SQESssYJbHQ) More x86_64 fixes. Signed-off-by: keir.fraser@cl.cam.ac.uk --- xen/arch/x86/domain.c | 33 ++++++++++++++++++++++++++++----- xen/arch/x86/x86_64/entry.S | 9 +++++++++ xen/include/public/xen.h | 9 ++++++++- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index f456a7b79a..fa441175cd 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -633,7 +633,6 @@ unsigned long hypercall_create_continuation( { struct mc_state *mcs = &mc_state[smp_processor_id()]; execution_context_t *ec; - unsigned long *preg; unsigned int i; va_list args; @@ -653,10 +652,34 @@ unsigned long hypercall_create_continuation( ec->eax = op; ec->eip -= 2; /* re-execute 'int 0x82' */ - for ( i = 0, preg = &ec->ebx; i < nr_args; i++, preg++ ) - *preg = va_arg(args, unsigned long); -#else - preg = NULL; /* XXX x86/64 */ + for ( i = 0; i < nr_args; i++ ) + { + switch ( i ) + { + case 0: ec->ebx = va_arg(args, unsigned long); break; + case 1: ec->ecx = va_arg(args, unsigned long); break; + case 2: ec->edx = va_arg(args, unsigned long); break; + case 3: ec->esi = va_arg(args, unsigned long); break; + case 4: ec->edi = va_arg(args, unsigned long); break; + case 5: ec->ebp = va_arg(args, unsigned long); break; + } + } +#elif defined(__x86_64__) + ec->rax = op; + ec->rip -= 2; /* re-execute 'syscall' */ + + for ( i = 0; i < nr_args; i++ ) + { + switch ( i ) + { + case 0: ec->rdi = va_arg(args, unsigned long); break; + case 1: ec->rsi = va_arg(args, unsigned long); break; + case 2: ec->rdx = va_arg(args, unsigned long); break; + case 3: ec->r10 = va_arg(args, unsigned long); break; + case 4: ec->r8 = va_arg(args, unsigned long); break; + case 5: ec->r9 = va_arg(args, unsigned long); break; + } + } #endif } diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index 447b77e9b0..153ae6ad6f 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -11,6 +11,13 @@ #include #include + +/* + * %rax = hypercall vector + * %rdi, %rsi, %rdx, %r10, %r8, %9 = hypercall arguments + * %r11, %rcx = SYSCALL-saved %rflags and %rip + * NB. We must move %r10 to %rcx for C function-calling ABI. + */ ENTRY(hypercall) sti movl $__GUEST_SS,8(%rsp) @@ -19,6 +26,7 @@ ENTRY(hypercall) pushq %rcx pushq $0 SAVE_ALL + movq %r10,%rcx andq $(NR_hypercalls-1),%rax leaq SYMBOL_NAME(hypercall_table)(%rip),%rcx callq *(%rcx,%rax,8) @@ -39,6 +47,7 @@ restore_all_xen: error_code: SAVE_ALL + sti movq %rsp,%rdi movl XREGS_entry_vector(%rsp),%eax leaq SYMBOL_NAME(exception_table)(%rip),%rdx diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index ac643140c4..fa10d5326b 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -23,7 +23,14 @@ * XEN "SYSTEM CALLS" (a.k.a. HYPERCALLS). */ -/* EAX = vector; EBX, ECX, EDX, ESI, EDI = args 1, 2, 3, 4, 5. */ +/* + * x86_32: EAX = vector; EBX, ECX, EDX, ESI, EDI = args 1, 2, 3, 4, 5. + * EAX = return value + * (argument registers may be clobbered on return) + * x86_64: RAX = vector; RDI, RSI, RDX, R10, R8, R9 = args 1, 2, 3, 4, 5, 6. + * RAX = return value + * (argument registers not clobbered on return; RCX, R11 are) + */ #define __HYPERVISOR_set_trap_table 0 #define __HYPERVISOR_mmu_update 1 #define __HYPERVISOR_set_gdt 2 -- 2.30.2